home *** CD-ROM | disk | FTP | other *** search
/ Kit PC World De Ampliacion De Windows 95 / Kit PC World de ampliacion de Windows 95.iso / internet / sweeper / samples / olecon~1 / controls / circle / circle~1.cpp < prev    next >
Text File  |  1995-11-25  |  12KB  |  415 lines

  1. //=--------------------------------------------------------------------------=
  2. // CircleCtl.Cpp
  3. //=--------------------------------------------------------------------------=
  4. // Copyright  1995  Microsoft Corporation.  All Rights Reserved.
  5. //
  6. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  7. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  8. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  9. // PARTICULAR PURPOSE.
  10. //=--------------------------------------------------------------------------=
  11. //
  12. #include "IPServer.H"
  13.  
  14. #include "Guids.H"
  15. #include "CircleCtl.H"
  16. #include "LocalObj.H"
  17. #include "Util.H"
  18. #include "Globals.H"
  19. #include "Resource.H"
  20.  
  21. // for ASSERT and FAIL
  22. //
  23. SZTHISFILE
  24.  
  25.  
  26. //=--------------------------------------------------------------------------=
  27. // Custom Verbs
  28. //=--------------------------------------------------------------------------=
  29. // if you don't have a property page, some hosts such as Visual Basic 4.0,
  30. // will give you a default verb, such as "Activate Object".  this is slightly
  31. // sub-optimal, so instead, we're just going to define our own verb to show
  32. // our about box.
  33. //
  34. #define CTLIVERB_ABOUTBOX 5
  35.  
  36. VERBINFO rgCircleCustomVerbs [] = {
  37.     { CTLIVERB_ABOUTBOX, IDS_CIRCLE_ABOUTBOXVERB, 0, OLEVERBATTRIB_ONCONTAINERMENU }
  38. };
  39.  
  40. //=--------------------------------------------------------------------------=
  41. // CCircleControl::Create
  42. //=--------------------------------------------------------------------------=
  43. // global static function that creates an instance of the control an returns
  44. // an IUnknown pointer for it.
  45. //
  46. // Parameters:
  47. //    IUnknown *        - [in] controlling unknown for aggregation
  48. //
  49. // Output:
  50. //    IUnknown *        - new object.
  51. //
  52. // Notes:
  53. //
  54. IUnknown *CCircleControl::Create
  55. (
  56.     IUnknown *pUnkOuter
  57. )
  58. {
  59.     // make sure we return the private unknown so that we support aggegation
  60.     // correctly!
  61.     //
  62.     CCircleControl *pNew = new CCircleControl(pUnkOuter);
  63.     return pNew->PrivateUnknown();
  64. }
  65.  
  66. //=--------------------------------------------------------------------------=
  67. // CCircleControl::CCircleControl
  68. //=--------------------------------------------------------------------------=
  69. // "Being born is like being kidnapped.  And then sold into slavery."
  70. //    - andy warhol (1928 - 87)
  71. //
  72. // Parameters:
  73. //    IUnknown *        - [in]
  74. //
  75. // Notes:
  76. //
  77. #pragma warning(disable:4355)  // using 'this' in constructor
  78. CCircleControl::CCircleControl
  79. (
  80.     IUnknown *pUnkOuter
  81. )
  82. : COleControl(pUnkOuter, OBJECT_TYPE_CTLCIRCLE, (IDispatch *)this)
  83. {
  84.     // initialize anything here ...
  85.     //
  86.     memset(&m_state, 0, sizeof(CIRCLECTLSTATE));
  87.  
  88.     // TODO: initialize anything you need to here.
  89.  
  90. }
  91. #pragma warning(default:4355)  // using 'this' in constructor
  92.  
  93. //=--------------------------------------------------------------------------=
  94. // CCircleControl::~CCircleControl
  95. //=--------------------------------------------------------------------------=
  96. // "We all labour against our own cure, for death is the cure of all diseases"
  97. //    - Sir Thomas Browne (1605 - 82)
  98. //
  99. // Notes:
  100. //
  101. CCircleControl::~CCircleControl ()
  102. {
  103.     // TODO: clean up anything here.
  104. }
  105.  
  106. //=--------------------------------------------------------------------------=
  107. // CCircleControl:RegisterClassData
  108. //=--------------------------------------------------------------------------=
  109. // register the window class information for your control here.
  110. // this information will automatically get cleaned up for you on DLL shutdown.
  111. //
  112. // Output:
  113. //    BOOL            - FALSE means fatal error.
  114. //
  115. // Notes:
  116. //
  117. BOOL CCircleControl::RegisterClassData
  118. (
  119.     void
  120. )
  121. {
  122.     WNDCLASS wndclass;
  123.  
  124.     // TODO: register any additional information you find interesting here.
  125.     //       this method is only called once for each type of control
  126.     //
  127.     memset(&wndclass, 0, sizeof(WNDCLASS));
  128.     wndclass.style          = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
  129.     wndclass.lpfnWndProc    = COleControl::ControlWindowProc;
  130.     wndclass.hInstance      = g_hInstance;
  131.     wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  132.     wndclass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
  133.     wndclass.lpszClassName  = WNDCLASSNAMEOFCONTROL(OBJECT_TYPE_CTLCIRCLE);
  134.  
  135.     return RegisterClass(&wndclass);
  136. }
  137.  
  138. //=--------------------------------------------------------------------------=
  139. // CCircleControl::BeforeCreateWindow
  140. //=--------------------------------------------------------------------------=
  141. // called just before the window is created.  Great place to set up the
  142. // window title, etc, so that they're passed in to the call to CreateWindowEx.
  143. // speeds things up slightly.
  144. //
  145. // Notes:
  146. //
  147. void CCircleControl::BeforeCreateWindow
  148. (
  149.     void
  150. )
  151. {
  152.     // TODO: users should modify m_dwWindowStyle, m_dwWindowStyleEx, m_szWindowTitle
  153.     // et al here so that the call to createwindow has as much information as
  154.     // possible.
  155.     // if you don't use this function, then you can probably just remove it.
  156. }
  157.  
  158. //=--------------------------------------------------------------------------=
  159. // CCircleControl::InternalQueryInterface
  160. //=--------------------------------------------------------------------------=
  161. // qi for things only we support.
  162. //
  163. // Parameters:
  164. // Parameters:
  165. //    REFIID        - [in]  interface they want
  166. //    void **       - [out] where they want to put the resulting object ptr.
  167. //
  168. // Output:
  169. //    HRESULT       - S_OK, E_NOINTERFACE
  170. //
  171. // Notes:
  172. //
  173. HRESULT CCircleControl::InternalQueryInterface
  174. (
  175.     REFIID  riid,
  176.     void  **ppvObjOut
  177. )
  178. {
  179.     IUnknown *pUnk;
  180.  
  181.     *ppvObjOut = NULL;
  182.  
  183.     // TODO: if you want to support any additional interrfaces, then you should
  184.     // indicate that here.  never forget to call COleControl's version in the
  185.     // case where you don't support the given interface.
  186.     //
  187.     if (DO_GUIDS_MATCH(riid, IID_ICircle)) {
  188.         pUnk = (IUnknown *)(ICircle *)this;
  189.     } else{
  190.         return COleControl::InternalQueryInterface(riid, ppvObjOut);
  191.     }
  192.  
  193.     pUnk->AddRef();
  194.     *ppvObjOut = (void *)pUnk;
  195.     return S_OK;
  196. }
  197.  
  198. //=--------------------------------------------------------------------------=
  199. // CCircleControl::LoadTextState
  200. //=--------------------------------------------------------------------------=
  201. // load in our text state for this control.
  202. //
  203. // Parameters:
  204. //    IPropertyBag *        - [in] property bag to read from
  205. //    IErrorLog *           - [in] errorlog object to use with proeprty bag
  206. //
  207. // Output:
  208. //    HRESULT
  209. //
  210. // Notes:
  211. //    - NOTE: if you have a binary object, then you should pass an unknown
  212. //      pointer to the property bag, and it will QI it for IPersistStream, and
  213. //      get said object to do a Load()
  214. //
  215. STDMETHODIMP CCircleControl::LoadTextState
  216. (
  217.     IPropertyBag *pPropertyBag,
  218.     IErrorLog    *pErrorLog
  219. )
  220. {
  221.     // TODO: implement your text load code here.
  222.     //
  223.     return S_OK;
  224. }
  225.  
  226. //=--------------------------------------------------------------------------=
  227. // CCircleControl::LoadBinaryState
  228. //=--------------------------------------------------------------------------=
  229. // loads in our binary state using streams.
  230. //
  231. // Parameters:
  232. //    IStream *            - [in] stream to write to.
  233. //
  234. // Output:
  235. //    HRESULT
  236. //
  237. // Notes:
  238. //
  239. STDMETHODIMP CCircleControl::LoadBinaryState
  240. (
  241.     IStream *pStream
  242. )
  243. {
  244.     // TODO: implement your binary load code here.  to prevent this from being
  245.     // a massive performance sink, you should probably try to organize your
  246.     // properties in such a way that enables you to do just one IStream::Read
  247.     // in the LoadBinaryState function.  fast is good.
  248.     //
  249.     return S_OK;
  250. }
  251.  
  252. //=--------------------------------------------------------------------------=
  253. // CCircleControl::SaveTextState
  254. //=--------------------------------------------------------------------------=
  255. // saves out the text state for this control using a property bag.
  256. //
  257. // Parameters:
  258. //    IPropertyBag *        - [in] the property bag with which to work.
  259. //    BOOL                  - [in] if TRUE, then write out ALL properties, even
  260. //                            if they're their the default value ...
  261. //
  262. // Output:
  263. //    HRESULT
  264. //
  265. // Notes:
  266. //
  267. STDMETHODIMP CCircleControl::SaveTextState
  268. (
  269.     IPropertyBag *pPropertyBag,
  270.     BOOL          fWriteDefaults
  271. )
  272. {
  273.     // TODO: implement your text save code here.
  274.     //
  275.     return S_OK;
  276. }
  277.  
  278. //=--------------------------------------------------------------------------=
  279. // CCircleControl::SaveBinaryState
  280. //=--------------------------------------------------------------------------=
  281. // save out the binary state for this control, using the given IStream object.
  282. //
  283. // Parameters:
  284. //    IStream  *             - [in] save to which you should save.
  285. //
  286. // Output:
  287. //    HRESULT
  288. //
  289. // Notes:
  290. //    - it is important that you seek to the end of where you saved your
  291. //      properties when you're done with the IStream.
  292. //
  293. STDMETHODIMP CCircleControl::SaveBinaryState
  294. (
  295.     IStream *pStream
  296. )
  297. {
  298.     // TODO: implement your binary save state code here.  to prevent this from being
  299.     // a massive performance sink, you should probably try to organize your
  300.     // properties in such a way that enables you to do just one IStream::Read
  301.     // in the LoadBinaryState function.  fast is good.
  302.     //
  303.     return S_OK;
  304. }
  305.  
  306.  
  307. //=--------------------------------------------------------------------------=
  308. // CCircleControl::OnDraw
  309. //=--------------------------------------------------------------------------=
  310. // "I don't very much enjoy looking at paintings in general.  i know too
  311. //  much about them.  i take them apart."
  312. //    - georgia o'keeffe (1887-1986)
  313. //
  314. // Parameters:
  315. //    HDC                - [in]  HDC to draw to
  316. //    LPCRECTL           - [in]  rect we're drawing to
  317. //    LPCRECTL           - [in]  window extent and origin for meta-files
  318. //    HDC                - [in]  HIC for target device
  319. //
  320. // Output:
  321. //    HRESULT
  322. //
  323. // Notes:
  324. //
  325. HRESULT CCircleControl::OnDraw
  326. (
  327.     HDC      hdcDraw,
  328.     LPCRECTL prcBounds,
  329.     LPCRECTL prcWBounds,
  330.     HDC      hicTargetDevice
  331. )
  332. {
  333.     HPEN hpen, hpenOld;
  334.  
  335.     hpen = CreatePen(PS_SOLID, 2, RGB(0,255,0));
  336.     if (!hpen)
  337.         return E_FAIL;
  338.  
  339.     hpenOld = SelectObject(hdcDraw, hpen);
  340.     Ellipse(hdcDraw, prcBounds->left, prcBounds->top, prcBounds->right, prcBounds->bottom);
  341.     SelectObject(hdcDraw, hpenOld);
  342.     DeleteObject(hpen);
  343.  
  344.     return S_OK;
  345. }
  346.  
  347. //=--------------------------------------------------------------------------=
  348. // CCircleControl::WindowProc
  349. //=--------------------------------------------------------------------------=
  350. // window procedure for this control.  nothing terribly exciting.
  351. //
  352. // Parameters:
  353. //     see win32sdk on window procs.
  354. //
  355. // Notes:
  356. //
  357. LRESULT CCircleControl::WindowProc
  358. (
  359.     HWND   hwnd,
  360.     UINT   msg,
  361.     WPARAM wParam,
  362.     LPARAM lParam
  363. )
  364. {
  365.     // TODO: handle any messages here, like in a normal window
  366.     // proc.  note that for special keys, you'll want to override and
  367.     // implement OnSpecialKey.
  368.     //
  369.     return DefWindowProc(hwnd, msg, wParam, lParam);
  370. }
  371.  
  372. //=--------------------------------------------------------------------------=
  373. // CCircleControl::DoCustomVerb
  374. //=--------------------------------------------------------------------------=
  375. //
  376. // long lverb
  377. //
  378. // notes:
  379. //
  380. HRESULT CCircleControl::DoCustomVerb
  381. (
  382.     LONG lVerb
  383. )
  384. {
  385.     if (lVerb == CTLIVERB_ABOUTBOX) {
  386.         AboutBox();
  387.         return S_OK;
  388.     }
  389.  
  390.     return OLEOBJ_S_INVALIDVERB;
  391. }
  392.  
  393.  
  394. //=--------------------------------------------------------------------------=
  395. // CCircleControl::AboutBox
  396. //=--------------------------------------------------------------------------=
  397. // prints up an about box.  fweeeee.
  398. //
  399. // Notes:
  400. //
  401. void CCircleControl::AboutBox
  402. (
  403.     void
  404. )
  405. {
  406.     // TODO: Ideally, one would use DialogBox, and some sort of Dialog Box here if
  407.     // they wanted a slightly more interesting About Box ...  you should
  408.     // still call ModalDialog first, however.
  409.     //
  410.     ModalDialog(TRUE);
  411.     MessageBox(NULL, "This is My Control", "About Circle", MB_OK | MB_TASKMODAL);
  412.     ModalDialog(FALSE);
  413. }
  414.  
  415.